package com.lizi.idgenerator.service;

import com.lizi.idgenerator.dto.idcreator.IdCreatorAddModel;
import com.lizi.idgenerator.dto.idcreator.IdCreatorResultModel;
import com.lizi.idgenerator.dto.ResultModel;
import com.lizi.idgenerator.entity.IdCreator;

/**
*  Id生成器服务
* @return
* @author kingman zhangjw@3vjia.com
* @since 2020/12/23
*/
public interface IdCreatorService {

    /**
     * 创建Id生成器
     * @param idCreatorAddModel
     * @return
     */
    ResultModel<Boolean> add(IdCreatorAddModel idCreatorAddModel);

    /**
     * 通过业务Id查询
     * @param businessId
     * @return
     */
    IdCreator getByBusinessId(String businessId);


    /**
     * 生成Id
     * <p>事务：SERIALIZABLE以下的等级，可重复读，这个事务等级保证了update的一致性，即更新后的数据是准确的，但在并发时，查询的数据是不保证一定是及时的。
     * 这样有个问题，就是idCreator.getCurrentValue()为旧值，还是事务进入后，查询时的数值，有可能不是最新的。所以如果要resultModel.setCurrentValue，
     * 就要拿到最后更新的值-步长 才能得到更新时的那个值。此事务执行该方法平均1.5秒
     * </p>
     * <p>事务：SERIALIZABLE，序列化,代价最高最可靠的隔离级别,如果用该事务等级，就不会出现重复读的问题，但带来较差的性能。
     * 此事务处理该方法2.5秒以上
     * </p>
     * @param businessId
     * @return
     */
    ResultModel<IdCreatorResultModel> generateId(String businessId);
}
